package org.dynamic.code.layer.n05intel64IA32.register;

import org.dynamic.code.layer.n05intel32IA32.register.IntelRegister;
import org.dynamic.code.layer.n05intel32IA32.register.control32.RegisterEFLAGS;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterAX;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterBP;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterBX;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterCX;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterDI;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterDX;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterSI;
import org.dynamic.code.layer.n05intel32IA32.register.general16.RegisterSP;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterEAX;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterEBP;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterEBX;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterECX;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterEDI;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterEDX;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterESI;
import org.dynamic.code.layer.n05intel32IA32.register.general32.RegisterESP;
import org.dynamic.code.layer.n05intel32IA32.register.general8.RegisterAL;
import org.dynamic.code.layer.n05intel32IA32.register.general8.RegisterBL;
import org.dynamic.code.layer.n05intel32IA32.register.general8.RegisterCL;
import org.dynamic.code.layer.n05intel32IA32.register.general8.RegisterDL;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterCS;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterDS;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterES;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterFS;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterGS;
import org.dynamic.code.layer.n05intel32IA32.register.segment16.RegisterSS;
import org.dynamic.code.layer.n05intel64IA32.register.control64.RegisterRFLAGS;
import org.dynamic.code.layer.n05intel64IA32.register.general16.RegisterREXW;
import org.dynamic.code.layer.n05intel64IA32.register.general32.RegisterREXD;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRAX;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRBP;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRBX;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRCX;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRDI;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRDX;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterREX;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRSI;
import org.dynamic.code.layer.n05intel64IA32.register.general64.RegisterRSP;
import org.dynamic.code.layer.n05intel64IA32.register.general8.RegisterBPL;
import org.dynamic.code.layer.n05intel64IA32.register.general8.RegisterDIL;
import org.dynamic.code.layer.n05intel64IA32.register.general8.RegisterREXL;
import org.dynamic.code.layer.n05intel64IA32.register.general8.RegisterSIL;
import org.dynamic.code.layer.n05intel64IA32.register.general8.RegisterSPL;
import org.dynamic.code.layer.n05intel64IA32.register.instruction64.RegisterRIP;

/**
 * @author Alban Auzeill
 */
public interface IntelREXRegister {

    interface General8 {

        RegisterAL AL = IntelRegister.General8.AL;
        RegisterBL BL = IntelRegister.General8.BL;
        RegisterCL CL = IntelRegister.General8.CL;
        RegisterDL DL = IntelRegister.General8.DL;
        // Warning, no access to: AH, BH, CH, DH
        RegisterDIL DIL = new RegisterDIL(-1);
        RegisterSIL SIL = new RegisterSIL(-1);
        RegisterBPL BPL = new RegisterBPL(-1);
        RegisterSPL SPL = new RegisterSPL(-1);
        RegisterREXL R8L = new RegisterREXL(-1, 8);
        RegisterREXL R9L = new RegisterREXL(-1, 9);
        RegisterREXL R10L = new RegisterREXL(-1, 10);
        RegisterREXL R11L = new RegisterREXL(-1, 11);
        RegisterREXL R12L = new RegisterREXL(-1, 12);
        RegisterREXL R13L = new RegisterREXL(-1, 13);
        RegisterREXL R14L = new RegisterREXL(-1, 14);
        RegisterREXL R15L = new RegisterREXL(-1, 15);
    }

    interface General16 {

        RegisterAX AX = IntelRegister.General16.AX;
        RegisterBX BX = IntelRegister.General16.BX;
        RegisterCX CX = IntelRegister.General16.CX;
        RegisterDX DX = IntelRegister.General16.DX;
        RegisterDI DI = IntelRegister.General16.DI;
        RegisterSI SI = IntelRegister.General16.SI;
        RegisterBP BP = IntelRegister.General16.BP;
        RegisterSP SP = IntelRegister.General16.SP;
        RegisterREXW R8W = new RegisterREXW(-1, 8);
        RegisterREXW R9W = new RegisterREXW(-1, 9);
        RegisterREXW R10W = new RegisterREXW(-1, 10);
        RegisterREXW R11W = new RegisterREXW(-1, 11);
        RegisterREXW R12W = new RegisterREXW(-1, 12);
        RegisterREXW R13W = new RegisterREXW(-1, 13);
        RegisterREXW R14W = new RegisterREXW(-1, 14);
        RegisterREXW R15W = new RegisterREXW(-1, 15);
    }

    interface General32 {

        RegisterEAX EAX = IntelRegister.General32.EAX;
        RegisterEBX EBX = IntelRegister.General32.EBX;
        RegisterECX ECX = IntelRegister.General32.ECX;
        RegisterEDX EDX = IntelRegister.General32.EDX;
        RegisterEDI EDI = IntelRegister.General32.EDI;
        RegisterESI ESI = IntelRegister.General32.ESI;
        RegisterEBP EBP = IntelRegister.General32.EBP;
        RegisterESP ESP = IntelRegister.General32.ESP;
        RegisterREXD R8D = new RegisterREXD(-1, 8);
        RegisterREXD R9D = new RegisterREXD(-1, 9);
        RegisterREXD R10D = new RegisterREXD(-1, 10);
        RegisterREXD R11D = new RegisterREXD(-1, 11);
        RegisterREXD R12D = new RegisterREXD(-1, 12);
        RegisterREXD R13D = new RegisterREXD(-1, 13);
        RegisterREXD R14D = new RegisterREXD(-1, 14);
        RegisterREXD R15D = new RegisterREXD(-1, 15);
    }

    interface General64 {

        RegisterRAX RAX = new RegisterRAX(-1);
        RegisterRBX RBX = new RegisterRBX(-1);
        RegisterRCX RCX = new RegisterRCX(-1);
        RegisterRDX RDX = new RegisterRDX(-1);
        RegisterRDI RDI = new RegisterRDI(-1);
        RegisterRSI RSI = new RegisterRSI(-1);
        RegisterRBP RBP = new RegisterRBP(-1);
        RegisterRSP RSP = new RegisterRSP(-1);
        RegisterREX R8 = new RegisterREX(-1, 8);
        RegisterREX R9 = new RegisterREX(-1, 9);
        RegisterREX R10 = new RegisterREX(-1, 10);
        RegisterREX R11 = new RegisterREX(-1, 11);
        RegisterREX R12 = new RegisterREX(-1, 12);
        RegisterREX R13 = new RegisterREX(-1, 13);
        RegisterREX R14 = new RegisterREX(-1, 14);
        RegisterREX R15 = new RegisterREX(-1, 15);
    }

    interface Segment16 {

        RegisterCS CS = IntelRegister.Segment16.CS;
        RegisterDS DS = IntelRegister.Segment16.DS;
        RegisterSS SS = IntelRegister.Segment16.SS;
        RegisterES ES = IntelRegister.Segment16.ES;
        RegisterFS FS = IntelRegister.Segment16.FS;
        RegisterGS GS = IntelRegister.Segment16.GS;
    }

    interface Control32 {

        RegisterEFLAGS EFLAGS = IntelRegister.Control32.EFLAGS;
        RegisterRFLAGS RFLAGS = new RegisterRFLAGS(-1);
    }

    interface Instruction64 {
        RegisterRIP RIP = new RegisterRIP(-1);
    }
}
